import re

html = """
<div class='comment'><p id='1'>这个教程太棒啦！</p></div>
<div class='comment'><p id='2'>学到好多知识，感谢！</p></div>
<div class='comment'><p id='3'>期待下一期内容～</p></div>
"""

# 编译正则：匹配 <div class='comment'> 包裹的 <p id='数字'> 里的评论内容
pattern = re.compile(r"<div class='comment'><p id='\d+'>(?P<comment>.*?)</p></div>", re.S) #re.S,使.能够匹配换行符
print(type(pattern))
results = pattern.finditer(html)

for res in results:
    print(res.group('comment'))

# 模拟日志文本，每行是带操作编号的记录
log_text = """
<action id='1001'>用户登录</action>
<action id='1002'>发布文章</action>
<action id='1003'>修改资料</action>
"""

# 编译正则：提取 <action id='数字'> 里的操作描述
pattern_2 = re.compile(r"<action id='(?P<id>\d+)'>(?P<action>.*?)</action>", re.S)
results_2 = pattern_2.finditer(log_text)
for res in results_2:
    print(res.group('id', 'action'))
    print(type(res.group('id', 'action')))


# 模拟含SQL的配置文本，表名在 <table> 标签内
sql_config = """
<sql id='query1'>
    SELECT * FROM <table>user_info</table> 
    WHERE age > 18
</sql>
<sql id='query2'>
    INSERT INTO <table>product_data</table> 
    (name, price) VALUES ('Book', 29.9)
</sql>
"""

# 编译正则：跨多行匹配 <table> 里的表名（re.S 让 . 匹配换行）
pattern_3 = re.compile(r"<sql id='.*?'>.*?<table>(?P<table>.*?)</table>.*?</sql>", re.S)
results_3 = pattern_3.finditer(sql_config)
for res in results_3:
    print(res.group('table'))

#联系完，简单总结一下：
"""
形如(?P<comment>.*?)是什么呢？
    这是命名捕获组，它的基本语法：(?P<name>pattern)
        ·(?P<：命名捕获组的起始标记。
        ·name：捕获组的名称，由字母、数字和下划线组成。
        ·>：结束命名部分。
        · pattern：具体的正则表达式模式。
"""

#那么接下来再熟悉下捕获组基础：
# 捕获组是正则表达式里用括号 () 括起来的部分，它能把匹配到的子字符串提取出来。
# 捕获组可以用于后续的引用、替换或者提取特定部分的匹配结果。
text = "apple 123"
# 普通捕获组
match = re.search(r"(\w+)\s(\d+)", text)
if match:
    print(match.group(1))  # 输出: apple
    print(match.group(2))  # 输出: 123

#显然这种使用编号来获取捕获内容，但当内容过大时，编号反而容易混淆
